﻿#pragma once

#include "ISistema.h"
#include "Hash.h"
#include "Pais.h"
#include "Avl.h"
#include "ColaHeapImp.h"
#include "Puntero.h"
#include "PaisFuncionHash.h"
#include "CadenaFuncionHash.h"
#include "FuncionIgualesPais.h"
#include "CastIterador.h"
#include "Tupla.h"
#include "IPais.h"
class Sistema : public ISistema
{
public:
	Sistema(int maxPaises, int maxCiudades, int maxRecursos);
	virtual ~Sistema();
	Puntero<Hash<Cadena,Puntero<Pais>>> hashPaises;
	Puntero<AVLImp<Puntero<Pais>>> avlPaises;
	Puntero<ColaHeapImp<Puntero<Pais>>> heapPaises;
	Puntero<Hash<Puntero<Recurso>,ListaImp<Puntero<Tupla<Puntero<Pais>,Puntero<Ciudad>>>>*>> hashRecOrdCron;
	//// Tipo 1
	TipoRetorno AltaPais(Cadena nombrePais);
	TipoRetorno AltaCiudad(Cadena nombrePais, Cadena nombreCiudad, bool esCapital);
	TipoRetorno AltaRecurso(Cadena nombrePais, Cadena nombreCiudad, Cadena recurso, int puntaje, int cantidad, int valor);
	Tupla<TipoRetorno, Puntero<Iterador<pPais>>> ImprimirJuego() const;
	Tupla<TipoRetorno, pRecurso> RecursoMasValioso(Cadena nombrePais, Cadena nombreCiudad);

	//// Tipo 2
	TipoRetorno BuscarRecursos(Puntero<Iterable<Cadena>> recursos) const;
	TipoRetorno BorrarPais(Cadena nombrePais);
	TipoRetorno BuscarRecMejorPuntaje(Puntero<Iterable<Cadena>> recursos) const;
	Tupla<TipoRetorno, Puntero<Iterador<Tupla<pPais, pCiudad>>>> CiudadesRecurso(Cadena recurso) const;
	Tupla<TipoRetorno, pPais> PaisMasCiudades() const;

	//// Opcionales
	TipoRetorno Importar(Cadena nombrePais, Cadena nombreCiudad, Cadena nombreRecurso, int cantidad);

private:
	int maxPais;
	int maxCiudades;
	int maxRecursos;
};
